package com.study.d012Components.tableview;

import javafx.application.Application;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ListChangeListener;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Cell;
import javafx.scene.control.CheckBox;
import javafx.scene.control.Label;
import javafx.scene.control.ProgressIndicator;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.scene.control.TableColumn.CellDataFeatures;
import javafx.scene.control.TableRow;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.Border;
import javafx.scene.layout.BorderStroke;
import javafx.scene.layout.BorderStrokeStyle;
import javafx.scene.layout.BorderWidths;
import javafx.scene.layout.CornerRadii;
import javafx.scene.layout.HBox;
import javafx.scene.paint.Paint;
import javafx.stage.Stage;
import javafx.util.Callback;

/** 自定义单元格样式
*@description
*@author xtayhame
*date 2020年3月14日
*version
*since v1.0
*/
public class TableViewCustomizeCellMain2 extends Application{
	public static void main(String[] args) {
		launch(args);

	}
	@Override
	public void start(Stage stage) throws Exception {
		AnchorPane an = new AnchorPane();

		Button b1 =new Button("测试");

		TableView<Data2> tableView = new TableView<Data2>();


		an.getChildren().addAll(b1, tableView);
		AnchorPane.setTopAnchor(b1, 10.0);
		AnchorPane.setLeftAnchor(b1, 20.0);
		AnchorPane.setTopAnchor(tableView, 40.0);
		AnchorPane.setLeftAnchor(tableView, 20.0);


		stage.setScene(new Scene(an, 400, 500));
		stage.show();

		//如果要实现对tableview列表值的增删改监控操作，则需要在数据源中使用如下方法
		/*ObservableList<Data2> datas=FXCollections.observableArrayList(new Callback<Data2, Observable[]>() {
			@Override
			public Observable[] call(Data2 param) {
				// TODO Auto-generated method stub
				return null;
			}
		});*/

		ObservableList<Data2> datas=FXCollections.observableArrayList();
		Data2 d1 = new Data2("张三", 19, 55.9, true);
		Data2 d2 = new Data2("李四", 20, 75.9, true);
		Data2 d3 = new Data2("王五", 21, 85.9, false);
		Data2 d4 = new Data2("赵柳", 55, 95.9, true);

		datas.addAll(d1,d2,d3,d4);

		tableView.setItems(datas);

		tableView.setEditable(true);

		TableColumn<Data2, String> tc_name=new TableColumn<Data2, String>("姓名");
		tc_name.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Data2,String>, ObservableValue<String>>() {
			@Override
			public ObservableValue<String> call(CellDataFeatures<Data2, String> param) {
				return param.getValue().getNameProperty();
			}
		});

		//自定义单元格格式
		tc_name.setCellFactory(new Callback<TableColumn<Data2,String>, TableCell<Data2,String>>() {
			@Override
			public TableCell<Data2, String> call(TableColumn<Data2, String> param) {
				TableCell<Data2, String> cell = new TableCell<Data2, String>(){
					@Override
					protected void updateItem(String item, boolean empty) {
						super.updateItem(item, empty);
						if(!empty && item !=null){
							HBox hBox = new HBox();
							Label label = new Label("★★★" + item + "★★★");
							hBox.getChildren().add(label);
							this.setGraphic(hBox);
						}
					}

				};
				return cell;
			}
		});


		TableColumn<Data2, Number> tc_age=new TableColumn<Data2, Number>("年龄");
		tc_age.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Data2,Number>, ObservableValue<Number>>(
				) {
					@Override
					public ObservableValue<Number> call(CellDataFeatures<Data2, Number> param) {
						return param.getValue().getAgeProperty();
					}
		});

		/************************************实现带编辑的功能   start****************************************************/
		//实现带编辑的功能
		tc_age.setCellFactory(new Callback<TableColumn<Data2,Number>, TableCell<Data2,Number>>() {

			@Override
			public TableCell<Data2, Number> call(TableColumn<Data2, Number> param) {
				TableCell<Data2, Number> cell = new TableCell<Data2, Number>(){

					TableCell<Data2, Number> tempCell=null;    //引用，用于调用

					@Override
					protected void updateItem(Number item, boolean empty) {
						super.updateItem(item, empty);
						if(item !=null && !empty){
							HBox hBox = new HBox();
							Label label = new Label(String.valueOf(item));
							hBox.getChildren().add(label);
							this.setGraphic(hBox);

							//使用setUserData()传递数据
							this.setUserData(item);

						}


					}

					//开始编辑
					@Override
					public void startEdit() {
						super.startEdit();
						HBox hBox = new HBox();
						TextField text = new TextField(this.getUserData().toString());
						hBox.getChildren().add(text);
						this.setGraphic(hBox);

						tempCell = this;


						//添加回车监听
						text.setOnKeyPressed(new EventHandler<KeyEvent>() {

							@Override
							public void handle(KeyEvent event) {
								if(event.getCode() == KeyCode.ENTER){

									String newAge= text.getText();
									//两种提交方式

									//第一种： 直接调用commitEdit()方法
									/*
									tempCell.commitEdit(Integer.parseInt(newAge));*/


									//第二种：
									Data2 d2= (Data2)tempCell.getTableRow().getItem();
									//注意：这里的age是Property属性
									d2.setAge(Integer.parseInt(newAge));
								}
							}
						});
					}

					@Override
					public void commitEdit(Number newValue) {
						super.commitEdit(newValue);
					}

					@Override
					public void cancelEdit() {
						super.cancelEdit();
						HBox hBox = new HBox();
						Label label = new Label(this.getUserData().toString());
						hBox.getChildren().add(label);
						this.setGraphic(hBox);
					}





				};

				return cell;
			}
		});
		/************************************实现带编辑的功能   end****************************************************/





		/************************************设置每行样式   start****************************************************/
		tableView.setRowFactory(new Callback<TableView<Data2>, TableRow<Data2>>() {

			@Override
			public TableRow<Data2> call(TableView<Data2> param) {
				TableRow<Data2> row  =new TableRow<Data2>(){
					@Override
					protected void updateItem(Data2 item, boolean empty) {
						super.updateItem(item, empty);

						if(item !=null && !empty){
							if(item.getAge() <22){
								System.out.println("来呀");
								//this.setBorder(new Border(new BorderStroke(Paint.valueOf("red"), BorderStrokeStyle.DOTTED, new CornerRadii(20), new BorderWidths(1))));
								this.setStyle("-fx-background-color:#FFF553");
							}
						}
					}

				};
				return row;
			}
		});


		/************************************设置每行样式   end****************************************************/





		//注意，这里要使用Number类型，因为只有ObservableValue<Number>这个泛型类
		TableColumn<Data2, Double> tc_score=new TableColumn<Data2, Double>("分数");
		tc_score.setCellValueFactory(new PropertyValueFactory<>("score"));

		//自定义单元格样式
		tc_score.setCellFactory(new Callback<TableColumn<Data2,Double>, TableCell<Data2,Double>>() {

			@Override
			public TableCell<Data2, Double> call(TableColumn<Data2, Double> param) {
				TableCell<Data2, Double> cell = new TableCell<Data2, Double>(){

					@Override
					protected void updateItem(Double item, boolean empty) {
						super.updateItem(item, empty);
						if(!empty && item !=null){
							HBox hBox = new HBox();
							ProgressIndicator pi = new ProgressIndicator();
							pi.setProgress(item/100);
							hBox.getChildren().add(pi);
							this.setGraphic(hBox);
						}
					}

				};

				return cell;
			}
		});




		TableColumn<Data2, Boolean> tc_is=new TableColumn<Data2, Boolean>("是否选中");
		tc_is.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Data2,Boolean>, ObservableValue<Boolean>>() {

			@Override
			public ObservableValue<Boolean> call(CellDataFeatures<Data2, Boolean> param) {
				return param.getValue().getIsProperty();
			}
		});


		//自定义单元格样式
		tc_is.setCellFactory(new Callback<TableColumn<Data2,Boolean>, TableCell<Data2,Boolean>>() {

			@Override
			public TableCell<Data2, Boolean> call(TableColumn<Data2, Boolean> param) {
				TableCell<Data2, Boolean> cell = new TableCell<Data2, Boolean>(){

					@Override
					protected void updateItem(Boolean item, boolean empty) {
						super.updateItem(item, empty);
						if(!empty && item !=null && this.getTableRow() !=null){
							HBox hBox = new HBox();
							CheckBox cb = new CheckBox();
							cb.setSelected(item);
							hBox.getChildren().add(cb);

							//这里要绑定一下，否则无法更新数据源中的值
							//获取原来的数据源
							ObservableList<Data2> currDatas = this.getTableView().getItems();
							//获取当前行的对象
							Data2  tempData = currDatas.get(this.getTableRow().getIndex());
							//进行字段值绑定
							cb.selectedProperty().bindBidirectional(tempData.getIsProperty());

							this.setGraphic(hBox);
						}
					}

				};
				return cell;
			}
		});


		tableView.getColumns().add(tc_name);
		tableView.getColumns().add(tc_age);
		tableView.getColumns().add(tc_score);
		tableView.getColumns().add(tc_is);


		tableView.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<Data2>() {

			@Override
			public void changed(ObservableValue<? extends Data2> observable, Data2 oldValue, Data2 newValue) {
				System.out.println(newValue.getAge());
			}
		});
		b1.setOnAction(new EventHandler<ActionEvent>() {

			@Override
			public void handle(ActionEvent event) {

			}
		});

	}
}
